<?php
/**
 * Classe de gestion des URL
 *
 * shUrl parse les requêtes pour obtenir le module, l'action
 * et les paramètres passés à la requête
 *
 * @category librairies
 * @package sh
 *
 * @author Mickaël CASTANHEIRO
 * @version 1.0
 */
class shRequest extends shBase {
    /*
     * Constantes
     */
    const DEFAULT_MODULE = 'default';
    const DEFAULT_ACTION = 'index';
    const DEFAULT_REQUEST = null;

    /**
     * @access private
     * @var shMoteur
     */
    private static $instance;

    /**#@+
	 * @access protected
	 * @var string
     */
    protected $module;
    protected $action;
    protected $request;
    protected $mode;
    /**#@-*/

    /**
     * @access protected
     * @var array
     */
    protected $arguments;


    /**
     * Accès au singleton de la classe
     *
     * Génère le singleton de la classe si cela n'a pas été fait.
     * Retourne simplement l'instance unique sinon
     *
     * @return shRequest Instance unique de la classe
     */
    public function __instance() {
	if ( !(self::$instance instanceof shRequest) )
	    self::$instance = new shRequest;
	return self::$instance;
    }


    /**
     * Constructeur de la classe
     *
     * @access private
     * @return shRequest Instance crée
     */
    private function __construct() {

	// Module
	$this->module = ( !empty($_GET['shModule']) ) ? $_GET['shModule'] : self::DEFAULT_MODULE;

	// Action
	$this->action = ( !empty($_GET['shAction']) ) ? $_GET['shAction'] : self::DEFAULT_ACTION;

	$this->request = self::DEFAULT_REQUEST;

	// Request indiquée
	if ( strpos($this->action, '-') ) {
	    $request = explode('-', $this->action);
	    $this->action = $request[0];
	    $this->request = $request[1];
	}

	// Arguments
        $this->arguments = ( !empty($_GET['shArguments']) ) ?
                            array_slice(explode(',', $_GET['shArguments']), 1) :
                            array();

	$this->mode = ( !empty($_GET['shMode']) ) ?
			$_GET['shMode'] :
			'html';
    }



    /**
     * Construit une url
     *
     * @param <string> Module
     * @param <string> Action
     * @param <string> Requête
     * @param <array> Paramètres à passer
     * @return <string> Url formattée
     */
    public static function link($_module=null, $_action=null, $_request=null, $_arguments=null, $_extension='html') {
	$url = URL;
	
	if ( !empty($_module) AND ($_module != '/') AND $_module != self::DEFAULT_MODULE ) $url .= escapeString($_module) . '/';

	if ( !empty($_action) ) {
	    $url .= escapeString($_action, '');
	    if ( !empty($_request) ) $url .= '-' . escapeString($_request);
	    if ( !empty($_arguments) ) {
		if ( !is_array($_arguments) ) $_arguments = array($_arguments);
		 $url .= ',' . implode(',', array_map('escapeString', $_arguments)); // Arguments échappés et séparés par des ,
	    }

	    $url .= '.' . $_extension;
	}

	return $url;
    }

  
    /**
     * Retourne le lien vers la requête en cours
     */
    public function __toString() {
	return self::link($this->module, $this->action, $this->request, $this->arguments, $this->mode);
    }
}
?>